/*
 * 
 * 
 * 
 */
package com.cms.template.directive;

import com.cms.constant.CommonConstant;
import com.cms.entity.Site;
import com.cms.utils.FreeMarkerUtils;
import com.cms.utils.WebUtils;
import freemarker.core.Environment;
import freemarker.template.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 模板指令 - 基类
 * 
 * 
 * 
 */
public abstract class BaseDirective implements TemplateDirectiveModel {
    
    /** "起始数量"参数名称 */
    private static final String START_PARAMETER_NAME = "start";

	/** "数量"参数名称 */
	private static final String COUNT_PARAMETER_NAME = "count";
	
	/** "条件"参数名称 */
	private static final String CONDITION_PARAMETER_NAME = "condition";

	/** "排序"参数名称 */
	private static final String ORDER_BY_PARAMETER_NAME = "orderBy";
	

    /**
     * 获取起始数量
     * 
     * @param params
     *            参数
     * @return 起始数量
     */
    protected Integer getStart(Map<String, TemplateModel> params) throws TemplateModelException {
        return FreeMarkerUtils.getParameter(START_PARAMETER_NAME, Integer.class, params);
    }
	
	/**
	 * 获取数量
	 * 
	 * @param params
	 *            参数
	 * @return 数量
	 */
	protected Integer getCount(Map<String, TemplateModel> params) throws TemplateModelException {
        return FreeMarkerUtils.getParameter(COUNT_PARAMETER_NAME, Integer.class, params);
	}
	
	/**
	 * 获取排序
	 * 
	 * @param params
	 *            参数
	 * @return 数量
	 */
	protected String getOrderBy(Map<String, TemplateModel> params) throws TemplateModelException {
        return FreeMarkerUtils.getParameter(ORDER_BY_PARAMETER_NAME, String.class, params);
	}
	
   /**
     * 获取条件
     * 
     * @param params
     *            参数
     * @return 条件
     */
    protected String getCondition(Map<String, TemplateModel> params) throws TemplateModelException {
        return FreeMarkerUtils.getParameter(CONDITION_PARAMETER_NAME, String.class, params);
    }

    /**
     * 获取当前站点
     *
     * @return 当前站点
     */
    protected Site getCurrentSite(){
        return (Site) WebUtils.getRequest().getAttribute(CommonConstant.CURRENT_SITE);
    }

    /**
     * 设置局部变量
     *
     * @param name
     *            名称
     * @param value
     *            变量值
     * @param env
     *            环境变量
     * @param body
     *            模板内容
     */
    protected void setLocalVariable(String name, Object value, Environment env, TemplateDirectiveBody body) throws TemplateException, IOException {
        TemplateModel preVariable = FreeMarkerUtils.getVariable(name, env);
        try {
            FreeMarkerUtils.setVariable(name, value, env);
            body.render(env.getOut());
        } finally {
            FreeMarkerUtils.setVariable(name, preVariable, env);
        }
    }

    /**
     * 设置局部变量
     *
     * @param variables
     *            变量
     * @param env
     *            环境变量
     * @param body
     *            模板内容
     */
    protected void setLocalVariables(Map<String, Object> variables, Environment env, TemplateDirectiveBody body) throws TemplateException, IOException {
        Map<String, Object> preVariables = new HashMap<>();
        for (String name : variables.keySet()) {
            TemplateModel preVariable = FreeMarkerUtils.getVariable(name, env);
            preVariables.put(name, preVariable);
        }
        try {
            FreeMarkerUtils.setVariables(variables, env);
            body.render(env.getOut());
        } finally {
            FreeMarkerUtils.setVariables(preVariables, env);
        }
    }
}